//===========================================================================
/**
 * @file	pair_poke_humor.c
 * @brief	連れ歩きポケモン機嫌値
 * @author	saito	GAME FREAK Inc.
 *
 */
//===========================================================================
#include "pair_poke_humor.h"

typedef struct P_POKE_HUMOR_DATA_tag
{
	int PasoRnd;
	u16 MonsNo;
	u16 First;
//	s8 HumorVal;
	POKEMON_PARAM *ppTop;

}P_POKE_HUMOR_DATA;

//--------------------------------------------------------------
/**
 * 初期化一度メモリ確保したら、ゲーム終了まで解放しない（解放関数は存在しません）
 * @param	inHeapID	ヒープID
 *
 * @retval	P_POKE_HUMOR_PTR	連れ歩きポケモン機嫌値構造体ポインタ
 */
//--------------------------------------------------------------
P_POKE_HUMOR_PTR PAIR_POKE_HUMOR_Init(const int inHeapID)
{
	P_POKE_HUMOR_PTR ptr;
	ptr = sys_AllocMemory(inHeapID, sizeof(P_POKE_HUMOR_DATA));
	MI_CpuClear8(ptr, sizeof(P_POKE_HUMOR_DATA));

///	ptr->HumorVal = POKE_HUMOR_DEF_VAL;
	ptr->MonsNo = 0;
	ptr->PasoRnd = 0;
	ptr->First = 0;
	ptr->ppTop = NULL;

	return ptr;
}

//--------------------------------------------------------------
/**
 * 機嫌値加算
 * @param	ptr			連れ歩きポケモン機嫌値構造体ポインタ
 * @param	inVal		加算機嫌値
 *
 * @retval	none
 */
//--------------------------------------------------------------
void PAIR_POKE_HUMOR_AddVal(P_POKE_HUMOR_PTR ptr, const s8 inVal)
{
	int val;
	s8 humor;

	if (ptr->ppTop == NULL){
		GF_ASSERT_MSG(0,"add_val_err\n");
		return ;
	}

	//機嫌値取得
	humor = PokeParaGet(ptr->ppTop,ID_PARA_humor,NULL);
	val = humor;
	val += inVal;
	if (val > POKE_HUMOR_MAX_VAL){
		humor = POKE_HUMOR_MAX_VAL;
	}else if (val < POKE_HUMOR_MIN_VAL){
		humor = POKE_HUMOR_MIN_VAL;
	}else{
		humor = val;
	}
	PokeParaPut(ptr->ppTop,ID_PARA_humor, &humor);
}

//--------------------------------------------------------------
/**
 * 機嫌値セット
 * @param	ptr			連れ歩きポケモン機嫌値構造体ポインタ
 * @param	inVal		機嫌値
 *
 * @retval	none
 */
//--------------------------------------------------------------
void PAIR_POKE_HUMOR_SetVal(P_POKE_HUMOR_PTR ptr, const s8 inVal)
{
	if (ptr->ppTop == NULL){
		GF_ASSERT_MSG(0,"set_val_err\n");
		return ;
	}

	PokeParaPut(ptr->ppTop,ID_PARA_humor, &inVal);
}

//--------------------------------------------------------------
/**
 * 機嫌値取得
 * @param	ptr			連れ歩きポケモン機嫌値構造体ポインタ
 *
 * @retval	u16			機嫌値
 */
//--------------------------------------------------------------
const s8 PAIR_POKE_HUMOR_GetVal(P_POKE_HUMOR_PTR ptr)
{
	s8 humor;
	if (ptr->ppTop == NULL){
		GF_ASSERT_MSG(0,"get_val_err\n");
		return 0;
	}
	//機嫌値取得
	humor = PokeParaGet(ptr->ppTop,ID_PARA_humor,NULL);
	return humor;
}

//--------------------------------------------------------------
/**
 * 対象ポケモンセット
 * @param	ptr			連れ歩きポケモン機嫌値構造体ポインタ
 * @param	pp			ポケモンパラム
 * @param	inMonsNo	モンスターナンバー
 * @param	inPasoRnd	個性乱数
 *
 * @retval	none
 */
//--------------------------------------------------------------
void PAIR_POKE_HUMOR_SetPoke(P_POKE_HUMOR_PTR ptr, POKEMON_PARAM *pp, const u16 inMonsNo, const int inPasoRnd)
{
	//現在セットされてるポケモンと新しくセットするポケモンが違うかをチェックする
	if (inMonsNo == 0){
		return ;
	}

	if ( (ptr->First == 0) ||
		 (ptr->MonsNo != inMonsNo)||
		 (ptr->PasoRnd != inPasoRnd) ){
		s8 humor;
		//上書き&機嫌値初期化
		ptr->MonsNo = inMonsNo;
		ptr->PasoRnd = inPasoRnd;
		humor = POKE_HUMOR_DEF_VAL;
		ptr->First = 1;
		ptr->ppTop = pp;
		PokeParaPut(ptr->ppTop,ID_PARA_humor, &humor);
		OS_Printf("上書き発生。monsno=%d,rnd=%x\n",inMonsNo,inPasoRnd);
	}
}

//--------------------------------------------------------------
/**
 * 一歩ごとの処理 内部では、現在連れ歩きポケモンがいるかを判定していない
 * @param	ptr			連れ歩きポケモン機嫌値構造体ポインタ
 *
 * @retval	none
 */
//--------------------------------------------------------------
void PAIR_POKE_HUMOR_ChangeVal(P_POKE_HUMOR_PTR ptr)
{
	s8 humor;
	//機嫌値取得
	if (ptr->ppTop == NULL){
		GF_ASSERT_MSG(0,"change_val_err\n");
		return ;
	}

	humor = PokeParaGet(ptr->ppTop,ID_PARA_humor,NULL);

	if (humor < POKE_HUMOR_DEF_VAL){
		humor++;
	}else if (humor > POKE_HUMOR_DEF_VAL){
		humor--;
	}
	PokeParaPut(ptr->ppTop,ID_PARA_humor, &humor);

}